home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / game / shoot / ADoom_src_1_2.lha / ADoom_src / c2p_040.s < prev    next >
Text File  |  1998-03-01  |  11KB  |  549 lines

  1.         mc68020
  2.         section    text,code
  3.  
  4. ; Chunky2Planar algorithm, originally by James McCoull
  5. ; Modified by Peter McGavin for variable size and depth
  6. ; and "compare buffer" (hope I didn't slow it down too much)
  7. ;
  8. ;     Cpu only solution VERSION 2
  9. ;    Optimised for 040+fastram
  10. ;    bitplanes are assumed contiguous!
  11. ;    analyse instruction offsets to check performance
  12.  
  13. ;void __asm c2p_6_040 (register __a0 UBYTE *chunky_data,
  14. ;                      register __a1 PLANEPTR raster,
  15. ;                      register __a2 UBYTE *compare_buffer,
  16. ;                      register __a4 UBYTE *xlate,
  17. ;                      register __d1 ULONG plsiz,
  18. ;                      register __d2 BOOL force_update);
  19.  
  20. ;void __asm c2p_8_040 (register __a0 UBYTE *chunky_data,
  21. ;                      register __a1 PLANEPTR raster,
  22. ;                      register __a2 UBYTE *compare_buffer,
  23. ;                      register __d1 ULONG plsiz);
  24.  
  25. ; a0 -> width*height chunky pixels
  26. ; a1 -> contiguous bitplanes
  27. ; a2 -> compare buffer
  28. ; d1 = width*height/8   (width*height must be a multiple of 32)
  29.  
  30.     ifeq    depth-8
  31.         xdef    _c2p_8_040
  32. _c2p_8_040:
  33.     else
  34.     ifeq    depth-6
  35.         xdef    _c2p_6_040
  36. _c2p_6_040:
  37.     else
  38.         fail    "unsupported depth!"
  39.     endc
  40.     endc
  41.  
  42. merge        macro ; in1,in2,tmp3,tmp4,mask,shift
  43. ; \1 = abqr
  44. ; \2 = ijyz
  45.         move.l    \2,\4
  46.         move.l    #\5,\3
  47.         and.l    \3,\2    ; \2 = 0j0z
  48.         and.l    \1,\3    ; \3 = 0b0r
  49.         eor.l    \3,\1    ; \1 = a0q0
  50.         eor.l    \2,\4    ; \4 = i0y0
  51.         ifeq    \6-1
  52.         add.l    \3,\3
  53.         else
  54.         lsl.l    #\6,\3    ; \3 = b0r0
  55.         endc
  56.         lsr.l    #\6,\4    ; \4 = 0i0y
  57.         or.l    \3,\2    ; \2 = bjrz
  58.         or.l    \4,\1    ; \1 = aiqy
  59.         endm
  60.  
  61. xlate        macro    ; translate 4 8-bit pixels to 6-bit EHB
  62.         move.b    (\1,a0),d7
  63.         move.b    (a4,d7.w),\2
  64.         lsl.w    #8,\2
  65.         move.b    (\1+8,a0),d7
  66.         move.b    (a4,d7.w),\2
  67.         swap    \2
  68.         move.b    (\1+16,a0),d7
  69.         move.b    (a4,d7.w),\2
  70.         lsl.w    #8,\2
  71.         move.b    (\1+24,a0),d7
  72.         move.b    (a4,d7.w),\2
  73.         endm
  74.  
  75. start:        movem.l    d2-d7/a2-a6,-(sp)
  76.  
  77.         sub.w    #46,sp        ; space for temporary variables
  78.  
  79.     ifle depth-6
  80.         move.w    d2,(44,sp)    ; video_force_update
  81.     endc
  82.  
  83. ; a0 = chunky buffer
  84. ; a1 = output area
  85. ; a2 = compare buffer
  86. ; d1 = plsiz
  87.  
  88.         movea.l    d1,a3        ; a3 = plsiz
  89.  
  90.         move.l    a0,(40,sp)
  91.         lsl.l    #3,d1
  92.         add.l    d1,(40,sp)    ; (40,sp) -> end of chunky data
  93.  
  94. first_loop:
  95.     ifle depth-6
  96.         tst.w    (44,sp)        ; force_update?
  97.         bne.b    first_case
  98.     endc
  99.         cmpm.l    (a0)+,(a2)+
  100.         bne.b    stub1
  101.         cmpm.l    (a0)+,(a2)+
  102.         bne.b    stub2
  103.         cmpm.l    (a0)+,(a2)+
  104.         bne.b    stub3
  105.         cmpm.l    (a0)+,(a2)+
  106.         bne.b    stub4
  107.         cmpm.l    (a0)+,(a2)+
  108.         bne.b    stub5
  109.         cmpm.l    (a0)+,(a2)+
  110.         bne.b    stub6
  111.         cmpm.l    (a0)+,(a2)+
  112.         bne.b    stub7
  113.         cmpm.l    (a0)+,(a2)+
  114.         bne.b    stub8
  115.  
  116.         addq.l    #4,a1        ; skip 32 pixels on output
  117.  
  118.         cmpa.l    (40,sp),a0
  119.         bcs.b    first_loop
  120.         bra.w    exit        ; exit if no changes found
  121.  
  122. stub8:        subq.l    #4,a0
  123.         subq.l    #4,a2
  124. stub7:        subq.l    #4,a0
  125.         subq.l    #4,a2
  126. stub6:        subq.l    #4,a0
  127.         subq.l    #4,a2
  128. stub5:        subq.l    #4,a0
  129.         subq.l    #4,a2
  130. stub4:        subq.l    #4,a0
  131.         subq.l    #4,a2
  132. stub3:        subq.l    #4,a0
  133.         subq.l    #4,a2
  134. stub2:        subq.l    #4,a0
  135.         subq.l    #4,a2
  136. stub1:        subq.l    #4,a0
  137.         subq.l    #4,a2
  138.  
  139. first_case:
  140.     ifgt depth-6        ; depth 8 code --- no need to xlate pixels
  141.         move.l    (0,a0),d1
  142.          move.l    (4,a0),d3
  143.         move.l    (8,a0),d0
  144.         move.l    (12,a0),d2
  145.         move.l    (2,a0),d4
  146.          move.l    (10,a0),d5
  147.         move.l    (6,a0),d6
  148.         move.l    (14,a0),d7
  149.  
  150.         move.l    d1,(0,a2)
  151.         move.l    d3,(4,a2)
  152.         move.l    d0,(8,a2)
  153.         move.l    d2,(12,a2)
  154.  
  155.          move.w    (16,a0),d1
  156.          move.w    (24,a0),d0
  157.         move.w    (20,a0),d3
  158.         move.w    (28,a0),d2
  159.          move.w    (18,a0),d4
  160.          move.w    (26,a0),d5
  161.         move.w    (22,a0),d6
  162.         move.w    (30,a0),d7
  163.  
  164.          move.w    d1,(16,a2)
  165.          move.w    d0,(24,a2)
  166.         move.w    d3,(20,a2)
  167.         move.w    d2,(28,a2)
  168.          move.w    d4,(18,a2)
  169.          move.w    d5,(26,a2)
  170.         move.w    d6,(22,a2)
  171.         move.w    d7,(30,a2)
  172.  
  173.         move.l    d6,a5
  174.         move.l    d7,a6
  175.  
  176.         merge    d1,d0,d6,d7,$00ff00ff,8
  177.         merge    d3,d2,d6,d7,$00ff00ff,8
  178.  
  179.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  180.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  181.  
  182.         exg    d1,a5
  183.         exg    d0,a6
  184.  
  185.         merge    d4,d5,d6,d7,$00ff00ff,8
  186.         merge    d1,d0,d6,d7,$00ff00ff,8
  187.  
  188.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  189.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  190.  
  191.         merge    d3,d1,d6,d7,$33333333,2
  192.         merge    d2,d0,d6,d7,$33333333,2    
  193.  
  194.         merge    d3,d2,d6,d7,$55555555,1
  195.         merge    d1,d0,d6,d7,$55555555,1
  196.  
  197.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  198.         move.l    d1,(1*4,sp)        ;plane1
  199.         move.l    d2,(2*4,sp)        ;plane2
  200.         move.l    d3,(3*4,sp)        ;plane3
  201.  
  202.         move.l    a5,d3
  203.         move.l    a6,d2
  204.  
  205.         merge    d3,d4,d6,d7,$33333333,2
  206.         merge    d2,d5,d6,d7,$33333333,2
  207.  
  208.         merge    d3,d2,d6,d7,$55555555,1
  209.         merge    d4,d5,d6,d7,$55555555,1
  210.  
  211.         move.l    d5,(4*4,sp)        ;plane4
  212.         move.l    d4,(5*4,sp)        ;plane5
  213.  
  214.         move.l    d2,(6*4,sp)        ;plane6
  215.         move.l    d3,(7*4,sp)        ;plane7
  216.  
  217.     else            ; depth 6 code, xlate from 8-bit to 6-bit EHB
  218.         moveq    #0,d7
  219.  
  220.         move.l    (a0),(a2)    ; copy to compare buffer
  221.         move.l    (4,a0),(4,a2)
  222.         move.l    (8,a0),(8,a2)
  223.         move.l    (12,a0),(12,a2)
  224.         move.l    (16,a0),(16,a2)
  225.         move.l    (20,a0),(20,a2)
  226.         move.l    (24,a0),(24,a2)
  227.         move.l    (28,a0),(28,a2)
  228.  
  229.         xlate    0,d1        ; does 8-bit to EHB colour translate
  230.         xlate    1,d0        ; 4 pixels at a time
  231.         xlate    4,d3
  232.         xlate    5,d2
  233.  
  234.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  235.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  236.  
  237.         movea.l    d1,a5
  238.         movea.l    d0,a6
  239.  
  240.         moveq    #0,d7
  241.  
  242.         xlate    2,d4
  243.         xlate    3,d5
  244.         xlate    6,d1
  245.         xlate    7,d0
  246.  
  247.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  248.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  249.  
  250.         merge    d3,d1,d6,d7,$33333333,2
  251.         merge    d2,d0,d6,d7,$33333333,2    
  252.  
  253.         merge    d3,d2,d6,d7,$55555555,1
  254.         merge    d1,d0,d6,d7,$55555555,1
  255.  
  256.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  257.         move.l    d1,(1*4,sp)        ;plane1
  258.         move.l    d2,(2*4,sp)        ;plane2
  259.         move.l    d3,(3*4,sp)        ;plane3
  260.  
  261.         move.l    a5,d3
  262.         move.l    a6,d2
  263.  
  264.         merge    d3,d4,d6,d7,$33333333,2
  265.         merge    d2,d5,d6,d7,$33333333,2
  266.  
  267.         merge    d4,d5,d6,d7,$55555555,1
  268.  
  269.         move.l    d5,(4*4,sp)        ;plane4
  270.         move.l    d4,(5*4,sp)        ;plane5
  271.  
  272.     endc
  273.  
  274.         adda.w    #32,a0
  275.         adda.w    #32,a2
  276.  
  277.         move.l    a1,(32,sp)        ; save output address
  278.         addq.l    #4,a1            ; skip 32 pixels on output
  279.  
  280.         cmpa.l    (40,sp),a0
  281.         bcc.w    final_case
  282.  
  283.  
  284. main_loop:
  285.     ifle depth-6
  286.         tst.w    (44,sp)        ; force_update?
  287.         bne.b    main_case
  288.     endc
  289.         cmpm.l    (a0)+,(a2)+    ; compare next 32 pixels
  290.         bne.b    mstub1
  291.         cmpm.l    (a0)+,(a2)+
  292.         bne.b    mstub2
  293.         cmpm.l    (a0)+,(a2)+
  294.         bne.b    mstub3
  295.         cmpm.l    (a0)+,(a2)+
  296.         bne.b    mstub4
  297.         cmpm.l    (a0)+,(a2)+
  298.         bne.b    mstub5
  299.         cmpm.l    (a0)+,(a2)+
  300.         bne.b    mstub6
  301.         cmpm.l    (a0)+,(a2)+
  302.         bne.b    mstub7
  303.         cmpm.l    (a0)+,(a2)+
  304.         bne.b    mstub8
  305.  
  306.         addq.l    #4,a1        ; skip 32 pixels on output
  307.  
  308.         cmpa.l    (40,sp),a0
  309.         bcs.b    main_loop
  310.         bra.w    final_case    ; exit if no more changes found
  311.  
  312. mstub8:        subq.l    #4,a0
  313.         subq.l    #4,a2
  314. mstub7:        subq.l    #4,a0
  315.         subq.l    #4,a2
  316. mstub6:        subq.l    #4,a0
  317.         subq.l    #4,a2
  318. mstub5:        subq.l    #4,a0
  319.         subq.l    #4,a2
  320. mstub4:        subq.l    #4,a0
  321.         subq.l    #4,a2
  322. mstub3:        subq.l    #4,a0
  323.         subq.l    #4,a2
  324. mstub2:        subq.l    #4,a0
  325.         subq.l    #4,a2
  326. mstub1:        subq.l    #4,a0
  327.         subq.l    #4,a2
  328.  
  329. main_case:    move.l    a1,(36,sp)    ; save current output address
  330.         move.l    (32,sp),a1    ; a1 = previous output address
  331.  
  332.     ifgt depth-6
  333.         move.l    (0,a0),d1
  334.          move.l    (4,a0),d3
  335.          move.l    (8,a0),d0
  336.         move.l    (12,a0),d2
  337.         move.l    (2,a0),d4
  338.          move.l    (10,a0),d5
  339.         move.l    (6,a0),d6
  340.         move.l    (14,a0),d7
  341.  
  342.         move.l    d1,(0,a2)
  343.         move.l    d3,(4,a2)
  344.         move.l    d0,(8,a2)
  345.         move.l    d2,(12,a2)
  346.  
  347.          move.w    (16,a0),d1
  348.          move.w    (24,a0),d0
  349.         move.w    (20,a0),d3
  350.         move.w    (28,a0),d2
  351.          move.w    (18,a0),d4
  352.          move.w    (26,a0),d5
  353.         move.w    (22,a0),d6
  354.         move.w    (30,a0),d7
  355.  
  356.          move.w    d1,(16,a2)
  357.          move.w    d0,(24,a2)
  358.         move.w    d3,(20,a2)
  359.         move.w    d2,(28,a2)
  360.          move.w    d4,(18,a2)
  361.          move.w    d5,(26,a2)
  362.         move.w    d6,(22,a2)
  363.         move.w    d7,(30,a2)
  364.  
  365.         move.l    d6,a5
  366.         move.l    d7,a6
  367.  
  368.         move.l    (0*4,sp),(a1)        ;plane0
  369.         adda.l    a3,a1            ;a1+=plsiz
  370.  
  371.         merge    d1,d0,d6,d7,$00ff00ff,8
  372.         merge    d3,d2,d6,d7,$00ff00ff,8
  373.  
  374.         move.l    (1*4,sp),(a1)        ;plane1
  375.         adda.l    a3,a1            ;a1+=plsiz
  376.  
  377.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  378.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  379.  
  380.         exg    d1,a5
  381.         exg    d0,a6
  382.  
  383.         move.l    (2*4,sp),(a1)        ;plane2
  384.         adda.l    a3,a1            ;a1+=plsiz
  385.  
  386.         merge    d4,d5,d6,d7,$00ff00ff,8
  387.         merge    d1,d0,d6,d7,$00ff00ff,8
  388.  
  389.         move.l    (3*4,sp),(a1)        ;plane3
  390.         adda.l    a3,a1            ;a1+=plsiz
  391.  
  392.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  393.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  394.  
  395.         move.l    (4*4,sp),(a1)        ;plane4
  396.         adda.l    a3,a1            ;a1+=plsiz
  397.  
  398.         merge    d3,d1,d6,d7,$33333333,2
  399.         merge    d2,d0,d6,d7,$33333333,2    
  400.  
  401.         move.l    (5*4,sp),(a1)        ;plane5
  402.         adda.l    a3,a1            ;a1+=plsiz
  403.  
  404.         merge    d3,d2,d6,d7,$55555555,1
  405.         merge    d1,d0,d6,d7,$55555555,1
  406.  
  407.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  408.         move.l    d1,(1*4,sp)        ;plane1
  409.         move.l    d2,(2*4,sp)        ;plane2
  410.         move.l    d3,(3*4,sp)        ;plane3
  411.  
  412.         move.l    a5,d3
  413.         move.l    a6,d2
  414.  
  415.         move.l    (6*4,sp),(a1)        ;plane6
  416.         adda.l    a3,a1            ;a1+=plsiz
  417.  
  418.         merge    d3,d4,d6,d7,$33333333,2
  419.         merge    d2,d5,d6,d7,$33333333,2
  420.  
  421.         move.l    (7*4,sp),(a1)        ;plane7
  422.         adda.l    a3,a1            ;a1+=plsiz
  423.  
  424.         merge    d3,d2,d6,d7,$55555555,1
  425.         merge    d4,d5,d6,d7,$55555555,1
  426.  
  427.         move.l    d5,(4*4,sp)        ;plane4
  428.         move.l    d4,(5*4,sp)        ;plane5
  429.  
  430.         move.l    d2,(6*4,sp)        ;plane6
  431.         move.l    d3,(7*4,sp)        ;plane7
  432.  
  433.     else            ; depth 6 code, xlate from 8-bit to 6-bit EHB
  434.         moveq    #0,d7
  435.  
  436.         move.l    (a0),(a2)
  437.         move.l    (4,a0),(4,a2)
  438.         move.l    (8,a0),(8,a2)
  439.         move.l    (12,a0),(12,a2)
  440.         move.l    (16,a0),(16,a2)
  441.         move.l    (20,a0),(20,a2)
  442.         move.l    (24,a0),(24,a2)
  443.         move.l    (28,a0),(28,a2)
  444.  
  445.         xlate    0,d1        ; does 8-bit to EHB colour translate
  446.         xlate    1,d0        ; 4 pixels at a time
  447.         xlate    4,d3
  448.         xlate    5,d2
  449.  
  450.         move.l    (0*4,sp),(a1)        ;plane0
  451.         adda.l    a3,a1            ;a1+=plsiz
  452.  
  453.         merge    d1,d3,d6,d7,$0f0f0f0f,4    
  454.         merge    d0,d2,d6,d7,$0f0f0f0f,4
  455.  
  456.         movea.l    d1,a5
  457.         movea.l    d0,a6
  458.  
  459.         moveq    #0,d7
  460.  
  461.         xlate    2,d4
  462.         xlate    3,d5
  463.         xlate    6,d1
  464.         xlate    7,d0
  465.  
  466.         move.l    (1*4,sp),(a1)        ;plane1
  467.         adda.l    a3,a1            ;a1+=plsiz
  468.  
  469.         merge    d4,d1,d6,d7,$0f0f0f0f,4
  470.         merge    d5,d0,d6,d7,$0f0f0f0f,4
  471.  
  472.         move.l    (2*4,sp),(a1)        ;plane2
  473.         adda.l    a3,a1            ;a1+=plsiz
  474.  
  475.         merge    d3,d1,d6,d7,$33333333,2
  476.         merge    d2,d0,d6,d7,$33333333,2    
  477.  
  478.         move.l    (3*4,sp),(a1)        ;plane3
  479.         adda.l    a3,a1            ;a1+=plsiz
  480.  
  481.         merge    d3,d2,d6,d7,$55555555,1
  482.         merge    d1,d0,d6,d7,$55555555,1
  483.  
  484.         move.l    d0,(0*4,sp)        ;plane0 (movem.l is slower!)
  485.         move.l    d1,(1*4,sp)        ;plane1
  486.         move.l    d2,(2*4,sp)        ;plane2
  487.         move.l    d3,(3*4,sp)        ;plane3
  488.  
  489.         move.l    (4*4,sp),(a1)        ;plane4
  490.         adda.l    a3,a1            ;a1+=plsiz
  491.  
  492.         move.l    a5,d3
  493.         move.l    a6,d2
  494.  
  495.         merge    d3,d4,d6,d7,$33333333,2
  496.  
  497.         move.l    (5*4,sp),(a1)        ;plane5
  498.         adda.l    a3,a1            ;a1+=plsiz
  499.  
  500.         merge    d2,d5,d6,d7,$33333333,2
  501.  
  502.         merge    d4,d5,d6,d7,$55555555,1
  503.  
  504.         move.l    d5,(4*4,sp)        ;plane4
  505.         move.l    d4,(5*4,sp)        ;plane5
  506.  
  507.     endc
  508.  
  509.         adda.w    #32,a0
  510.         adda.w    #32,a2
  511.  
  512.         movea.l    (36,sp),a1    ; restore current output address
  513.         move.l    a1,(32,sp)    ; save output address
  514.  
  515.         addq.l    #4,a1        ; skip 32 pixels on output
  516.  
  517.         cmpa.l    (40,sp),a0
  518.         bcs.w    main_loop
  519.  
  520.  
  521. final_case:    move.l    (32,sp),a1    ; a1 = previous output address
  522.  
  523.         move.l    (0*4,sp),(a1)        ;plane0
  524.         adda.l    a3,a1            ;a1+=plsiz
  525.         move.l    (1*4,sp),(a1)         ;plane1
  526.         adda.l    a3,a1            ;a1+=plsiz
  527.         move.l    (2*4,sp),(a1)        ;plane2
  528.         adda.l    a3,a1            ;a1+=plsiz
  529.         move.l    (3*4,sp),(a1)        ;plane3
  530.         adda.l    a3,a1            ;a1+=plsiz
  531.         move.l    (4*4,sp),(a1)        ;plane4    
  532.         adda.l    a3,a1            ;a1+=plsiz
  533.         move.l    (5*4,sp),(a1)        ;plane5
  534.     ifgt depth-6
  535.         adda.l    a3,a1            ;a1+=plsiz
  536.         move.l    (6*4,sp),(a1)        ;plane6
  537.         adda.l    a3,a1            ;a1+=plsiz
  538.         move.l    (7*4,sp),(a1)        ;plane7
  539.     endc
  540.  
  541. exit:        add.w    #46,sp
  542.         movem.l    (sp)+,d2-d7/a2-a6
  543.         rts
  544.  
  545.         cnop    0,4
  546. end:
  547.  
  548.         end
  549.